package com.zzh.lib.protector;

import android.content.Context;

/**
 * 程序保护
 */
public class HProtector {

    public static String checkSignature(Context context) {
        return SecurityCheckUtil.getSingleInstance().getSignature(context);
    }

    /**
     * 是否是Debug模式
     *
     * @param context
     * @return
     */
    public static boolean checkIsDebug(Context context) {
        return SecurityCheckUtil.getSingleInstance().checkIsDebugVersion(context) ||
                SecurityCheckUtil.getSingleInstance().checkIsDebuggerConnected();
    }

    /**
     * 设备是否被ROOT
     *
     * @return true被
     */
    public static boolean checkIsRoot() {
        return SecurityCheckUtil.getSingleInstance().isRoot();
    }

    /**
     * 检测Xposed是否存在
     *
     * @return true 存在
     */
    public static boolean checkIsXposedExist() {
        return SecurityCheckUtil.getSingleInstance().isXposedExistByThrow();
    }

    /**
     * 检测Xposed是否存在，存在则禁用它
     *
     * @return true 禁用成功
     */
    public static boolean checkXposedExistAndDisableIt() {
        return SecurityCheckUtil.getSingleInstance().tryShutdownXposed();
    }

    /**
     * Java层级检测是否被调试。
     *
     * @return true 调试。
     */
    public static boolean checkIsBeingTracedByJava() {
        return SecurityCheckUtil.getSingleInstance().readProcStatus();
    }

    /**
     * C 层级检测是否被调试。
     */
    public static void checkIsBeingTracedByC() {
        NDKUtil.loadLibrariesOnce(null);
    }

    /**
     * 是否运行在模拟器里面。
     *
     * @param context  上下文变量
     * @param callback 回调
     * @return
     */
    public static boolean checkIsRunningInEmulator(Context context, EmulatorCheckCallback callback) {
        return EmulatorCheckUtil.getSingleInstance().readSysProperty(context, callback);
    }

    /**
     * 是否运行在虚拟机里面
     *
     * @param uniqueMsg
     * @param callback
     * @return
     */
    public static boolean checkIsRunningInVirtualApk(String uniqueMsg, VirtualCheckCallback callback) {
        return VirtualApkCheckUtil.getSingleInstance().checkByCreateLocalServerSocket(uniqueMsg, callback);
    }
}
